ISO-2022-JPを用いて記述されたHTML文書を扱う際、これに含まれるエスケープシーケンスが不適切であると、Safari2は致命的に文書解釈を誤り、JavaScriptのコードの実行に失敗する場合があります。この場合、出るはずのないエラーメッセージを表示させる等の誤動作を行います。
検証プログラム §
(力尽きたので略。「電子小説・Ajax読書プログラム テストNo.1」でスクリプトエラーが発生していた原因がこれに該当)
詳細 §
ISO-2022-JPは、2バイト文字から1バイト文字に移行するための2つのエスケープシーケンスを持っています。以下の2つがそれにあたります。(C表記)
const char * ASCII = "\33(B";
const char * JISX0201 = "\33(J";
この場合、一般的にはASCIIを使うのが正当です。
しかし、JISX0201を使っていて、その後ASCIIを使ってASCIIモードに戻していない場合、Safariは誤動作するようです。
通常、入手できるツールは、ASCIIに戻すので問題ありません。
より詳細な原因 §
他人が読んでも意味のない世界ではありますが、うちの内部ツール(非公開=公開する意味がないほど個人用)に、HTMLのプリプロセサのhtmlpp2というものがあります。これが、ASCIIではなくJISX0201を使ってコードを戻していました。
これが、「電子小説・Ajax読書プログラム テストNo.1」でスクリプトエラーが発生した直接的な原因です。
とはいえ、これが間違いかというと、あながちそうとも言い切れない面が残るのが悩ましいところです。なぜなら、ASCIIに戻した場合、そのあとの0x5cはバックスラッシュ扱いになるわけですが、書かれた文書の意図は円記号です。それを考えると、JISX0201に戻したい気持ちが起こるのも、理がないとは言えません。
ちなみに、なぜhtmlpp2がISO-2022-JPに変換しているのかと言えば、まだNetscape Navigator 2.xなどが使われている時代に、それが最も安全と言われていたためで、現代の事情にはマッチしていません。全面的な切り替えのための時間がないので、放置されているだけという情けない状況です。